import env from '@/env.js';
import { useUserStore } from '@/store/userStore.js';

const { BASE_URL, BASE_URL_WS } = env;

export { BASE_URL, BASE_URL_WS };
export function request(config = {}) {
    let {
        url,
        data = {},
        method = "GET",
        header = {},
        handleError = true,
        timeout = 60000, // 添加超时设置，默认60秒
    } = config;

    // 确保url格式正确
    url = (BASE_URL + url).replace(/([^:]\/)\/+/g, "$1");

    // 设置请求头
    const token = uni.getStorageSync('Authorization');
    if (token) {
        header["Authorization"] = token;
    }

    // 如果是POST请求，确保设置Content-Type
    if (method.toUpperCase() === 'POST' && !header['Content-Type']) {
        header['Content-Type'] = 'application/json';
    }

    return new Promise((resolve, reject) => {
        uni.request({
            url,
            data,
            method,
            header,
            timeout, // 设置超时时间
            success: res => {
                // 检查响应头中是否包含新的token信息
                checkAndUpdateToken(res.header);

                // 兼容新旧返回码格式：1或200表示成功，0或500表示失败
                if (res.data.code === 1 || res.data.code === 200) {
                    resolve(res);
                } else if (res.data.code === 0 || res.data.code === 500) { // 错误提示
                    if (handleError) {
                        uni.showModal({
                            title: "系统提示",
                            content: res.data.msg,
                            showCancel: false
                        });
                    }
                    reject(res.data);
                } else if (res.data.code === 600) { // 登录过期
                    uni.showModal({
                        title: "系统提示",
                        content: res.data.msg,
                        showCancel: false,
                        success: () => {
                            // 清空token
                            const userStore = useUserStore();
                            userStore.logout();
                            uni.navigateTo({
                                url: '/pages/login/login'
                            });
                        }
                    });

                } else if (res.data.code === 601) { // 未知错误提示
                    uni.showModal({
                        title: "系统提示",
                        content: res.data.msg,
                        showCancel: false,

                    });
                }
            },
            fail: err => {
                console.error('请求失败:', err);

                // 处理不同类型的错误
                let errMsg = '网络请求失败';
                if (err.errMsg.includes('timeout')) {
                    errMsg = '请求超时，请检查网络';
                } else if (err.errMsg.includes('Failed to connect')) {
                    errMsg = '无法连接到服务器，请检查网络设置';
                }

                if (handleError) {
                    uni.showModal({
                        title: "网络错误",
                        content: errMsg,
                        showCancel: false
                    });
                }

                reject(err);
            },
            complete: () => {
                // 可以在这里处理加载状态
            }
        });
    });
}

// 检查并更新token
function checkAndUpdateToken(headers) {
    // 注意: uniapp中header的key可能会被转为小写
    const headerKeys = Object.keys(headers).map(key => key.toLowerCase());

    // 检查响应头中是否包含新token
    const hasNewToken = headerKeys.includes('authorization') ||
        headerKeys.includes('new-token') ||
        headerKeys.includes('token-refreshed');

    if (hasNewToken) {
        // 获取userStore
        const userStore = useUserStore();

        // 获取新token (优先级: Authorization > New-Token)
        let newToken = null;

        // 检查各种可能的header名称（大小写不敏感）
        for (const key of Object.keys(headers)) {
            if (key.toLowerCase() === 'authorization') {
                newToken = headers[key];
                break;
            }
        }

        if (!newToken) {
            for (const key of Object.keys(headers)) {
                if (key.toLowerCase() === 'new-token') {
                    newToken = headers[key];
                    break;
                }
            }
        }

        // 如果找到了新token，更新存储
        if (newToken) {
            console.log('检测到新token，正在更新...');
            // 更新userStore中的token
            userStore.setToken(newToken);
            // 直接更新Authorization，确保下一次请求使用新token
            uni.setStorageSync('Authorization', newToken);
        }
    }
}